package Common;

import POJO.FilePathMes;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

public class JXFileUtils {

    @Test
    public void test(){
        try {
            getJXConnentChar();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    // 解密JX的相关操作
    // 把下载的JX放到C://JX 这个文件夹下面，在执行文档
    /**
     * 直接调用这个方法，就能将C://JX下面的未解密的JX解密成JSON，并且创建对应的XML文件
     * 暂时只处理特定目录的jx
     */
    public static void getJXConnentChar() throws Exception {
//        String desktopPath = Paths.get(System.getProperty("user.home"), "Desktop").toString();
        List<File> jxFiles = findJxFiles(new File(FilePathMes.JX_PATH),"jx");
        if(jxFiles.isEmpty()) throw new Exception("无法找到jx场景文件");
        Files.createDirectories(Paths.get(FilePathMes.JSON_PATH));

        for (File file : jxFiles) {
            try(BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(Paths.get(getSplitStr(FilePathMes.JSON_PATH + "\\" + file.getName(), ".") + ".json")))) {
                byte[] bytes1 = DecryptUtil.readContent(file.getAbsolutePath());
                // JX->字节流
                if (bytes1.length > 0) {
                    byte[] bytes = DecryptUtil.decodeBytesReturnBytes(bytes1);
                    bos.write(bytes, 0,bytes.length);
                }
                bos.flush();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    public static String getRealFileName(String fileName,String split){
        int dotIndex = fileName.lastIndexOf(split);
        String nameWithoutExtension = (dotIndex != -1) ?
                fileName.substring(0, dotIndex) : fileName;
        return nameWithoutExtension;
    }






    public static void handleFolder(String folderPath) {
        Path dir = Paths.get(folderPath);
        try {
            // 检查文件夹是否存在
            if (Files.notExists(dir)) {
                // 不存在则创建文件夹（包括所有必需的父目录）
                Files.createDirectories(dir);
//                System.out.println("文件夹已创建: " + dir.toAbsolutePath());
            } else {
                // 存在则删除所有内容
                deleteFolderContents(dir);
//                System.out.println("文件夹内容已清空: " + dir.toAbsolutePath());
            }
        } catch (Exception e) {
            System.err.println("处理文件夹时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void deleteFolderContents(Path dir) throws Exception {
        if (!Files.isDirectory(dir)) {
            return;
        }

        // 递归删除文件夹中的所有内容
        try (Stream<Path> walk = Files.walk(dir)) {
            walk.sorted(Comparator.reverseOrder())
                    .map(Path::toFile)
                    .forEach(file -> {
                        try {
                            Files.delete(file.toPath());
                        } catch (Exception e) {
                            System.err.println("删除文件/目录失败: " + file + " - " + e.getMessage());
                        }
                    });
        }
    }


    public static String getSplitStr(String fileName,String split){
        int dotIndex = fileName.lastIndexOf(split);
        if (dotIndex > 0) { // 确保不是隐藏文件（如 .gitignore）
             fileName = fileName.substring(0, dotIndex);

        }
        return fileName;

    }

    /**
     * 递归遍历目录，查找所有以 .[s]  ] 结尾的文件
     */
    public static List<File> findJxFiles(File directory,String s) {
        List<File> result = new ArrayList<>();
//        System.out.println(directory.listFiles());
        if (!directory.exists() || !directory.isDirectory()) {
            return result;
        }
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    result.addAll(findJxFiles(file,s)); // 递归搜索子目录
                } else if (file.getName().toLowerCase().endsWith("."+s)) {
                    result.add(file); // 匹配 .jx 文件
                }
            }
        }
        return result;
    }
}
